package com.lyncs.ods.modules.txn.service.impl;

import com.lyncs.ods.common.web.RequestHolder;
import com.lyncs.ods.constant.LyncsOdsConstant;
import com.lyncs.ods.modules.txn.model.TxnOperateInfo;
import com.lyncs.ods.modules.txn.mapper.TxnOperateInfoMapper;
import com.lyncs.ods.modules.txn.service.TxnOperateInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * ods操作信息 服务实现类
 * </p>
 *
 * @author alex
 * @since 2022-04-09
 */
@Service
public class TxnOperateInfoServiceImpl extends ServiceImpl<TxnOperateInfoMapper, TxnOperateInfo> implements TxnOperateInfoService {

    @Override
    public List<Long> getTopTicket(Long companyId, Integer type) {
        List<TxnOperateInfo> infos = this.lambdaQuery().eq(TxnOperateInfo::getCompanyId, companyId)
                .eq(TxnOperateInfo::getType, type)
                .eq(TxnOperateInfo::getStatus, LyncsOdsConstant.EnableStatus.ENABLE.getKey())
                .orderByDesc(TxnOperateInfo::getCreateTime)
                .list();
        return infos.stream().map(TxnOperateInfo::getRefId).collect(Collectors.toList());
    }

    @Override
    public Boolean isTopTicket(Long companyId, @NotNull Integer type, @NotNull Long ticketId) {
        if (Objects.isNull(companyId)) {
            return Boolean.FALSE;
        }
        return this.lambdaQuery().eq(TxnOperateInfo::getCompanyId, companyId)
                .eq(TxnOperateInfo::getType, type)
                .eq(TxnOperateInfo::getRefId, ticketId)
                .eq(TxnOperateInfo::getStatus, LyncsOdsConstant.EnableStatus.ENABLE.getKey())
                .count() > 0;
    }

    @Override
    public void saveTopTicket(@NotNull LyncsOdsConstant.TxnType txnType, @NotNull Long refId, Integer type) {
        Integer status = type == 1 ? LyncsOdsConstant.EnableStatus.ENABLE.getKey() : LyncsOdsConstant.EnableStatus.DISABLE.getKey();
        Long companyId = RequestHolder.getCompanyId();
        TxnOperateInfo info = this.lambdaQuery().eq(TxnOperateInfo::getType, txnType.getKey())
                .eq(TxnOperateInfo::getRefId, refId)
                .eq(TxnOperateInfo::getCompanyId, companyId)
                .eq(TxnOperateInfo::getOperateType, 1).one();
        if (Objects.isNull(info)) {
            this.save(new TxnOperateInfo(txnType.getKey(), refId, companyId, RequestHolder.getUserId(), status));
            return;
        }
        this.lambdaUpdate().eq(TxnOperateInfo::getId,info.getId())
                .set(TxnOperateInfo::getStatus,status)
                .set(TxnOperateInfo::getUpdateTime, RequestHolder.getRequestDateTime())
                .update();
    }
}
